package main

import "fmt"

/*
go语言中尽量避免抛出异常
一般发生的错误，都期望程序员自己处理错误
在函数的实现的过程中，出现了不能处理的错误，可以返回给调用者处理
 */
func main()  {
	//file,err := os.OpenFile("test.txt",os.O_RDONLY,666)
	//defer file.Close()	//延时语句
	//if err != nil {
	//	fmt.Println("打开文件失败",err)
	//}
	//fmt.Println("end")
	//if err := hello("xxw"); err != nil {
	//	fmt.Println(err)
	//}
	fmt.Println(get(2))
	fmt.Println("main end....")

}

//内置类型  error
//内置包  errors  产生错误对象

//func hello(name string) error {
//	if len(name)  == 0 {
//		return errors.New("error: name is empty!!!")  //产生错误
//	}
//	fmt.Println("hello",name)
//	return nil
//}

/*
	error 往往能预知的
	不能预知的 在go语言中称为panic
 */

//func get(index int) int {
//	arr := [3]int{5,6,7}
//	return arr[index]
//}

/*
recover()	函数  用于终止处理流程，也就是python try...except
recover()	要配合defer执行
Panic 可以在任何地方引发，但是recover只有在defer调用的函数中才有效
如果没有recover ，出现异常这个进程就退出
 */
func get(index int) int{
	defer func() {
		if r := recover();r != nil {
			fmt.Println("something error!",r)
		} else{
			fmt.Println("没有错误")
		}
	}()
	defer fmt.Println("this is defer")
	arr := [3]int{5,6,7}
	panic("手动触发异常")
	return arr[index]
}